package com.carb.controller.admin;

import com.carb.annotation.RequiredRoles;
import com.carb.constant.AuthorityConstant;
import com.carb.dto.*;
import com.carb.entity.ProjectType;
import com.carb.enums.CommonStatus;
import com.carb.result.PageResult;
import com.carb.result.Result;
import com.carb.service.IProjectService;
import com.carb.vo.ProjectVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 服务项目管理 前端控制器
 * </p>
 *
 * @author XuChaoyang
 * @since 2025-01-18
 */
@RestController("adminProjectController")
@RequestMapping("/admin/project")
@Tag(name = "服务项目管理相关接口")
@Slf4j
public class ProjectController {

    @Resource
    private IProjectService projectService;

    /**
     * 新增服务项目
     * @param projectAddDTO 新增服务项目信息
     */
    @RequiredRoles({AuthorityConstant.ADMIN, AuthorityConstant.STORE_MANAGER})
    @PostMapping("/add")
    @Operation(summary = "新增服务项目")
    public Result<String> addProject(@RequestBody ProjectAddDTO projectAddDTO) {
        log.info("新增服务项目：{}", projectAddDTO);
        projectService.addProject(projectAddDTO);
        log.info("新增服务项目成功！");
        return Result.success();
    }

    /**
     * 服务项目分页查询
     * @param projectPageQueryDTO 查询条件
     * @return 服务项目分页结果
     */
    @GetMapping("/page")
    @Operation(summary = "服务项目分页查询")
    public Result<PageResult<ProjectVO>> pageQuery(ProjectPageQueryDTO projectPageQueryDTO) {
        log.info("服务项目分页查询：{}", projectPageQueryDTO);
        PageResult<ProjectVO> pageResult = projectService.pageQuery(projectPageQueryDTO);
        log.info("服务项目分页查询成功！");
        return Result.success(pageResult);
    }

    /**
     * 启用/禁用服务项目状态
     * @param status 服务项目状态
     * @param id 服务项目id
     */
    @RequiredRoles({AuthorityConstant.ADMIN, AuthorityConstant.STORE_MANAGER})
    @PostMapping("/status/{status}")
    @Operation(summary = "启用/禁用服务项目状态")
    public Result<String> updateStatus(@PathVariable @Parameter(description = "服务项目状态") CommonStatus status,
                                       @Parameter(description = "服务项目id") Long id) {
        String updateStatus = status.getDesc();
        log.info("{}服务项目状态：{},{}", updateStatus, id, status);
        projectService.updateStatus(id, status);
        log.info("{}服务项目状态成功！", updateStatus);
        return Result.success();
    }

    /**
     * 根据服务项目id查询服务项目信息
     * @param id 服务项目id
     * @return 查询结果
     */
    @GetMapping("/{id}")
    @Operation(summary = "根据服务项目id查询服务项目信息")
    public Result<ProjectVO> getProjectById(@PathVariable @Parameter(description = "服务项目id") Long id) {
        log.info("根据服务项目id查询服务项目信息，服务项目id：{}", id);
        ProjectVO projectVO = projectService.getProjectById(id);
        log.info("根据服务项目id查询服务项目信息成功！");
        return Result.success(projectVO);
    }

    /**
     * 修改服务项目信息
     * @param projectUpdateDTO 修改的服务项目信息
     */
    @RequiredRoles({AuthorityConstant.ADMIN, AuthorityConstant.STORE_MANAGER})
    @PutMapping
    @Operation(summary = "修改服务项目信息")
    public Result<String> updateProject(@RequestBody ProjectUpdateDTO projectUpdateDTO) {
        log.info("修改服务项目信息：{}", projectUpdateDTO);
        projectService.updateProject(projectUpdateDTO);
        log.info("修改服务项目信息成功！");
        return Result.success();
    }

    /**
     * 删除服务项目
     * @param id 服务项目id
     */
    @RequiredRoles({AuthorityConstant.ADMIN, AuthorityConstant.STORE_MANAGER})
    @DeleteMapping("/{id}")
    @Operation(summary = "删除服务项目")
    public Result<String> deleteProject(@PathVariable @Parameter(description = "服务项目id") Long id) {
        log.info("删除服务项目，服务项目id：{}", id);
        projectService.deleteProject(id);
        log.info("删除服务项目成功！");
        return Result.success();
    }

    /**
     * 新增服务项目类型
     * @param projectTypeName 新增服务项目类型名称
     */
    @RequiredRoles({AuthorityConstant.ADMIN, AuthorityConstant.STORE_MANAGER})
    @PostMapping("/type/add")
    @Operation(summary = "新增服务项目类型")
    public Result<String> addProjectType(@RequestParam @Parameter(description = "服务项目类型名称", required = true) String projectTypeName) {
        log.info("新增服务项目类型：{}", projectTypeName);
        projectService.addProjectType(projectTypeName);
        log.info("新增服务项目类型成功！");
        return Result.success();
    }

    /**
     * 服务项目类型分页查询
     * @param projectTypePageQueryDTO 查询条件
     * @return 服务项目类型分页结果
     */
    @GetMapping("/type/page")
    @Operation(summary = "服务项目类型分页查询")
    public Result<PageResult<ProjectType>> pageQueryProjectType(ProjectTypePageQueryDTO projectTypePageQueryDTO) {
        log.info("服务项目类型分页查询：{}", projectTypePageQueryDTO);
        PageResult<ProjectType> pageResult = projectService.pageQueryProjectType(projectTypePageQueryDTO);
        log.info("服务项目类型分页查询成功！");
        return Result.success(pageResult);
    }

    /**
     * 启用/禁用服务项目类型状态
     * @param status 服务项目类型状态
     * @param id 服务项目类型id
     */
    @RequiredRoles({AuthorityConstant.ADMIN, AuthorityConstant.STORE_MANAGER})
    @PostMapping("/type/status/{status}")
    @Operation(summary = "启用/禁用服务项目类型状态")
    public Result<String> updateProjectTypeStatus(@PathVariable @Parameter(description = "类型状态") CommonStatus status,
                                                 @Parameter(description = "服务项目类型id") Long id) {
        String updateStatus = status.getDesc();
        log.info("{}服务项目类型状态：{},{}", updateStatus, id, status);
        projectService.updateProjectTypeStatus(id, status);
        log.info("{}服务项目类型状态成功！", updateStatus);
        return Result.success();
    }

    /**
     * 根据服务项目类型id查询服务项目类型信息
     * @param id 服务项目类型id
     * @return 查询结果
     */
    @GetMapping("/type/{id}")
    @Operation(summary = "根据服务项目类型id查询服务项目类型信息")
    public Result<ProjectType> getProjectTypeById(@PathVariable @Parameter(description = "服务项目类型id") Long id) {
        log.info("根据服务项目类型id查询服务项目类型信息，服务项目类型id：{}", id);
        ProjectType projectType = projectService.getProjectTypeById(id);
        log.info("根据服务项目类型id查询服务项目类型信息成功！");
        return Result.success(projectType);
    }

    /**
     * 修改服务项目类型信息
     * @param projectTypeUpdateDTO 修改的服务项目类型信息
     */
    @RequiredRoles({AuthorityConstant.ADMIN, AuthorityConstant.STORE_MANAGER})
    @PutMapping("/type")
    @Operation(summary = "修改服务项目类型信息")
    public Result<String> updateProjectType(@RequestBody ProjectTypeUpdateDTO projectTypeUpdateDTO) {
        log.info("修改服务项目类型信息：{}", projectTypeUpdateDTO);
        projectService.updateProjectType(projectTypeUpdateDTO);
        log.info("修改服务项目类型信息成功！");
        return Result.success();
    }

    /**
     * 删除服务项目类型
     * @param id 服务项目类型id
     */
    @RequiredRoles({AuthorityConstant.ADMIN, AuthorityConstant.STORE_MANAGER})
    @DeleteMapping("/type/{id}")
    @Operation(summary = "删除服务项目类型")
    public Result<String> deleteProjectType(@PathVariable @Parameter(description = "服务项目类型id") Long id) {
        log.info("删除服务项目类型，服务项目类型id：{}", id);
        projectService.deleteProjectType(id);
        log.info("删除服务项目类型成功！");
        return Result.success();
    }

    /**
     * 查询所有启用的服务项目类型
     * @return 启用的服务项目类型列表
     */
    @GetMapping("/type/list")
    @Operation(summary = "查询所有启用的服务项目类型")
    public Result<List<ProjectType>> listProjectType() {
        log.info("查询所有启用的服务项目类型");
        List<ProjectType> projectTypeList = projectService.listProjectType();
        log.info("查询所有启用的服务项目类型成功！");
        return Result.success(projectTypeList);
    }

}
